/**
 * 身份证号解析结果接口
 */
export interface IdCardParseResult {
  /** 性别：'1' 表示男，'2' 表示女 */
  sex: '1' | '2' | '';
  /** 年龄数值 */
  age: string;
  /** 年龄单位：'岁' | '月' | '天' */
  ageUnit: '岁' | '月' | '天';
  /** 出生日期 */
  birthDate: Date | null;
}

/**
 * 解析身份证号，获取性别、年龄和年龄单位
 * @param idCard - 身份证号（15位或18位）
 * @returns 解析结果对象，包含性别、年龄、年龄单位和出生日期
 */
export function parseIdCard(idCard: string): IdCardParseResult {
  const result: IdCardParseResult = {
    sex: '',
    age: '',
    ageUnit: '岁',
    birthDate: null
  };

  if (!idCard) {
    return result;
  }

  // 去除空格
  idCard = idCard.trim();

  // 验证身份证号长度（15位或18位）
  if (idCard.length !== 15 && idCard.length !== 18) {
    return result;
  }

  let birthDate: Date;
  let genderCode: string;

  if (idCard.length === 18) {
    // 18位身份证：第7-14位是出生日期（YYYYMMDD），第17位（索引16）是性别码
    const birthStr = idCard.substring(6, 14);
    genderCode = idCard.substring(16, 17);

    const year = parseInt(birthStr.substring(0, 4));
    const month = parseInt(birthStr.substring(4, 6)) - 1; // 月份从0开始
    const day = parseInt(birthStr.substring(6, 8));

    birthDate = new Date(year, month, day);
  } else {
    // 15位身份证：第7-12位是出生日期（YYMMDD），第15位（索引14）是性别码
    const birthStr = idCard.substring(6, 12);
    genderCode = idCard.substring(14, 15);

    const year = parseInt('19' + birthStr.substring(0, 2)); // 15位身份证年份是2位，补19
    const month = parseInt(birthStr.substring(2, 4)) - 1;
    const day = parseInt(birthStr.substring(4, 6));

    birthDate = new Date(year, month, day);
  }

  // 验证日期是否有效
  if (isNaN(birthDate.getTime())) {
    return result;
  }

  result.birthDate = birthDate;

  // 解析性别：奇数为男，偶数为女
  const genderNum = parseInt(genderCode);
  if (!isNaN(genderNum)) {
    result.sex = genderNum % 2 === 1 ? '1' : '2';
  }

  // 计算年龄
  const now = new Date();
  let years = now.getFullYear() - birthDate.getFullYear();
  let months = now.getMonth() - birthDate.getMonth();
  let days = now.getDate() - birthDate.getDate();

  // 调整月份和天数
  if (days < 0) {
    months--;
    const lastMonth = new Date(now.getFullYear(), now.getMonth(), 0);
    days += lastMonth.getDate();
  }

  if (months < 0) {
    years--;
    months += 12;
  }

  // 根据年龄设置年龄和年龄单位
  if (years >= 1) {
    result.age = years.toString();
    result.ageUnit = '岁';
  } else if (months >= 1) {
    result.age = months.toString();
    result.ageUnit = '月';
  } else {
    result.age = days > 0 ? days.toString() : '0';
    result.ageUnit = '天';
  }

  return result;
}

